package cn.cangfei.massage.service;

import cn.cangfei.massage.dto.VisitDoctorPlanDTO;
import cn.cangfei.massage.dto.VisitPlanDTO;
import cn.cangfei.massage.dto.VisitPlanResiduesDTO;
import cn.cangfei.massage.dto.param.VisitPlanParam;
import cn.cangfei.massage.dto.param.VisitPlanUpdateParam;
import cn.cangfei.massage.dto.update.AppointmentForDoctor;
import cn.cangfei.massage.entity.Jia;
import cn.cangfei.massage.entity.UpdateDay;
import cn.cangfei.massage.entity.VisitPlan;

import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * @author Lemon  2313812755@qq.com
 * @date 2023/3/1
 */

public interface IVisitPlanService {

    /**
     * 创建出诊计划
     *
     * @param param 出诊计划参数
     * @return 是否成功
     */
    boolean insertAll(VisitPlanParam param);

    /**
     * 更新出诊计划
     *
     * @param id    记录编号
     * @param param 出诊计划参数
     * @return 是否成功
     */
    boolean update(Long id, VisitPlanUpdateParam param);

    /**
     * 删除出诊计划
     *
     * @param id 计划编号
     * @return 是否成功
     */
    boolean delete(Long id);

    /**
     * 删除出诊计划
     *
     * @param idList 计划编号
     * @return 是否成功
     */
    boolean deleteAll(List<Long> idList);

    /**
     * 获取出诊计划
     *
     * @param id 计划编号
     * @return 出诊计划
     */
    Optional<VisitPlanDTO> getOptional(Long id);

    /**
     * 判断是否，存在该计划
     *
     * @param id 计划编号
     * @return 是否存在
     */
    boolean count(Long id);

    /**
     * 获取师傅出诊信息
     *
     * @param doctorId 师傅编号
     * @param start    开始日期
     * @param end      结束日期
     * @return 师傅出诊信息
     */
    VisitDoctorPlanDTO getDoctorPlan(Long doctorId, Date start, Date end);

    /**
     * 查找出诊列表
     *
     * @param massageId 推拿馆编号
     * @param specialId  专科编号
     * @param clinicId   门诊编号
     * @param doctorId   师傅编号
     * @param week       出诊星期
     * @param pageNum    第几页
     * @param pageSize   页大小
     * @return 出诊列表
     */
    List<VisitPlanDTO> list(Long massageId, Long specialId, Long clinicId, Long doctorId, String week,
                            Integer pageNum, Integer pageSize);

    /**
     * 获取师傅出诊信息
     *
     * @param massageId 推拿馆编号
     * @param doctorId   师傅编号
     * @param week       星期
     * @return 师傅出诊信息
     */
    List<VisitPlanResiduesDTO> getDoctorPlanByDate(Long massageId, Long doctorId, String week, String day);

    /**
     * 获取某天出诊计划信息
     *
     * @param doctorId 师傅编号
     * @param time     时间段：1 上午，2 下午
     * @param day      某天
     * @return 出诊计划列表
     */
    List<VisitPlan> getByTimeAndDate(Long doctorId, Integer time, Date day);

    /**
     * 获取某段时间出诊计划
     *
     * @param start 开始时间
     * @param end   结束时间
     * @return 出诊计划编号
     */
    List<Long> list(Date start, Date end);

    /**
     * 定时扫描请假表来进行删除的
     */
    void deleteJia();


    // 请假接口
    void getJia(Jia jia);

    // 获取假期
    String getJia(Long doctorId);

    // 修改上班每周的接口
    void updateDay(UpdateDay updateDay);

    // 获取时间段根据师傅id
    String getDuan(Long id);

    // 获取上班日期
    String getDay(Long id);


    /**
     * 根据师傅编号查询这个星期的预约人数情况
     *
     * @param doctorId
     * @return
     */
    List<AppointmentForDoctor> searchVisitPlanByDoctorAndDateAndWeek(Long doctorId);

    /**
     * 根据doctorId判断是否有这个师傅的出诊计划
     *
     * @param doctorId
     * @return
     */
    Integer getPlanByDoctorId(Long doctorId);

}
